WebGLã¡ãã·ã¥ã·ã§ãŒããŒã®ããªããã£ãã«ãªã³ã°ã®å¹çãæ¢ããã¯ãã¹ãã©ãããã©ãŒã 3Dã°ã©ãã£ãã¯ã¹ã§ã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããããã®æ©æãžãªã¡ããªé€å»æè¡ã«çŠç¹ãåœãŠãŸãã
WebGLã¡ãã·ã¥ã·ã§ãŒããŒã®ããªããã£ãã«ãªã³ã°ïŒæ©æãžãªã¡ããªé€å»
ãŠã§ãããŒã¹ã®3Dã°ã©ãã£ãã¯ã¹ã®çµ¶ãéãªãé²åã®äžã§ãã¹ã ãŒãºã§é åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã«ã¯ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã®æé©åãäžå¯æ¬ ã§ããWebGLã¯ããŠã§ãäžã®3Dã°ã©ãã£ãã¯ã¹ã®æšæºã§ãããéçºè ã«æ²¡å ¥åã®ããžã¥ã¢ã«ãäœæããããã®åŒ·åãªããŒã«ãæäŸããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãããæè¿è¿œå ããããã®ã§ããžãªã¡ããªã®ããæè»ã§å¹ççãªåŠçãå¯èœã«ããããšã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããŸãããã®ããã°èšäºã§ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒã®ã³ã³ããã¹ãå ã§ã®ããªããã£ãã«ãªã³ã°ã®æŠå¿µãæãäžããç¹ã«ã¬ã³ããªã³ã°å¹çãé«ããããã®éèŠãªãã¯ããã¯ã§ããæ©æãžãªã¡ããªé€å»ã«éç¹ã眮ããŠããŸãã
ã¬ã³ããªã³ã°æé©åã®éèŠæ§
æè¡çãªè©³çްã«å ¥ãåã«ãã¬ã³ããªã³ã°ã®æé©åããªãéèŠãªã®ããçè§£ããããšãéèŠã§ãã3Dã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã¯èšç®è² è·ã®é«ãããã»ã¹ã§ããããã«ã¯ãé ç¹ã®å€æãã©ã®äžè§åœ¢ã衚瀺ããããã®æ±ºå®ããããŠæåŸã«ããããã®äžè§åœ¢ãç»é¢ã«ã©ã¹ã¿ã©ã€ãºããããšãå«ãŸããŸããã·ãŒã³ãè€éã«ãªãã»ã©ãGPUïŒGraphics Processing UnitïŒãè¡ãå¿ èŠã®ããäœæ¥ãå¢ããŸããããã«ããããã¬ãŒã ã¬ãŒãã®äœäžãäžå®å®ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãªã©ã®ããã©ãŒãã³ã¹ããã«ããã¯ãçºçããå¯èœæ§ããããŸãã广çãªæé©åã¯ã以äžã«çŽæ¥ã€ãªãããŸãã
- ãã¬ãŒã ã¬ãŒãã®åäžïŒãã¬ãŒã ã¬ãŒããé«ãã»ã©ãããžã¥ã¢ã«ãã¹ã ãŒãºã«ãªããã¬ã¹ãã³ã¹ã®è¯ããšã¯ã¹ããªãšã³ã¹ã«ãªããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒã¬ã³ããªã³ã°ãé«éåããããšãããé åçã§æ¥œããã€ã³ã¿ã©ã¯ã·ã§ã³ã«ã€ãªãããŸãã
- ããŸããŸãªããã€ã¹ã§ã®ããã©ãŒãã³ã¹ã®åäžïŒæé©åã«ããã匷åãªãã¹ã¯ãããããæºåž¯é»è©±ãŸã§ãããŸããŸãªããã€ã¹ã§ããäžè²«ãããšã¯ã¹ããªãšã³ã¹ãä¿èšŒãããŸããããŒããŠã§ã¢ã®æ©èœã¯å°åã«ãã£ãŠå€§ããç°ãªããããããã¯ã°ããŒãã«ãªèŠèŽè ã«ãšã£ãŠéåžžã«éèŠã§ãã
- æ¶è²»é»åã®åæžïŒããå¹ççãªã¬ã³ããªã³ã°ã¯ãããããªãŒã®æ¶èãæããã®ã«åœ¹ç«ã¡ãŸããããã¯ãã¢ãã€ã«ãŠãŒã¶ãŒã«ãšã£ãŠç¹ã«éèŠã§ãã
ç®æšã¯ãGPUã®ã¯ãŒã¯ããŒããæå°éã«æããããšã§ãããããªããã£ãã«ãªã³ã°ã¯ãããå®çŸããããã®åºæ¬çãªãã¯ããã¯ã§ãã
ããªããã£ãã«ãªã³ã°ã®çè§£
ããªããã£ãã«ãªã³ã°ã¯ãã©ã¹ã¿ã©ã€ãºãããåã«ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ããäžèŠãªãžãªã¡ããªãåé€ããããã»ã¹ã§ããããã¯ãã«ã¡ã©ã«è¡šç€ºãããªãããããã以äžåŠçããå¿ èŠã®ãªãããªããã£ãïŒéåžžã¯WebGLã®äžè§åœ¢ïŒãèå¥ããããšã«ãã£ãŠè¡ãããŸããã«ãªã³ã°ã«ã¯ããã€ãã®çš®é¡ãããããããããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®ç°ãªã段éã§åäœããŸãã
- èé¢ã«ãªã³ã°ïŒäžè¬çã§äžå¯æ¬ ãªãã¯ããã¯ãèé¢ã«ãªã³ã°ã¯ãã«ã¡ã©ããé¢ããæ¹åãåããŠããäžè§åœ¢ãç Žæ£ããŸããããã¯ãé ç¹ã®å·»ãé ïŒæèšåããŸãã¯åæèšåãïŒã«äŸåããŸããéåžžã`gl.enable(gl.CULL_FACE)`ããã³`gl.cullFace()` WebGL颿°ãä»ããŠå¶åŸ¡ãããŸãã
- èŠéå°ã«ãªã³ã°ïŒã«ã¡ã©ã®èŠéå°ïŒã«ã¡ã©ãèŠãããšãã§ããåé圢ã®é åïŒã®å€åŽã«ããããªããã£ããç Žæ£ããŸããããã¯ãé ç¹ã·ã§ãŒããŒãŸãã¯å¥ã®ååŠçã¹ãããã§å®è¡ãããããšããããããŸãã
- ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ïŒããé«åºŠãããã¯ãããªããã£ããä»ã®ãªããžã§ã¯ãã®èåŸã«é ãããŠãããã©ããã倿ããŸããèé¢ã«ãªã³ã°ãèŠéå°ã«ãªã³ã°ãããèšç®ã³ã¹ããé«ããªããŸãããè€éãªã·ãŒã³ã§ã¯å€§ããªã¡ãªããããããŸããããã¯ã深床ãã¹ãããããŒããŠã§ã¢ãªã¯ã«ãŒãžã§ã³ã¯ãšãªãµããŒãïŒå©çšå¯èœãªå ŽåïŒãå©çšããããé«åºŠãªã¡ãœãããªã©ã®ãã¯ããã¯ã䜿çšããŠå®è¡ã§ããŸãã
- View Frustum CullingïŒèŠéå°ã«ãªã³ã°ã®å¥ã®ååã
ããªããã£ãã«ãªã³ã°ã®æå¹æ§ã¯ãã¬ã³ããªã³ã°ããã»ã¹ã®å šäœçãªããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ããŸããèŠããªããžãªã¡ããªãæ©æã«åé€ããããšã§ãGPUã¯éèŠãªãã®ã®ã¬ã³ããªã³ã°ã«ãªãœãŒã¹ãéäžãããããšãã§ãããã¬ãŒã ã¬ãŒãã®åäžã«è²¢ç®ããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒïŒæ°ãããã©ãã€ã
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã§ã®ãžãªã¡ããªã®åŠçæ¹æ³ã«ããã倧ããªé²åã衚ããŠããŸããåŸæ¥ã®é ç¹ã·ã§ãŒããŒããã©ã°ã¡ã³ãã·ã§ãŒããŒãšã¯ç°ãªããã¡ãã·ã¥ã·ã§ãŒããŒã¯ããªããã£ãã®ãããã§åäœããããåªããæè»æ§ãšå¶åŸ¡ãæäŸããŸãããã®ã¢ãŒããã¯ãã£ã«ããããžãªã¡ããªã®ããå¹ççãªåŠçãå¯èœã«ãªããæ©æãžãªã¡ããªé€å»ã®ãããªé«åºŠãªæé©åæè¡ã®æ©äŒãéãããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã®äž»ãªå©ç¹ã¯æ¬¡ã®ãšããã§ãã
- ãžãªã¡ããªåŠçã®æè»æ§ã®åäžïŒã¡ãã·ã¥ã·ã§ãŒããŒã¯ããžãªã¡ããªã®åŠçæ¹æ³ããã詳现ã«å¶åŸ¡ã§ããŸããããªããã£ããçæãŸãã¯ç Žæ£ã§ãããããè€éãªãžãªã¡ããªæäœã«é©ããŠããŸãã
- ãªãŒããŒãããã®åæžïŒã¡ãã·ã¥ã·ã§ãŒããŒã¯ãè€æ°ã®é ç¹ã®åŠçã1ã€ã®ãŠãããã«ã°ã«ãŒãåããããšã«ãããåŸæ¥ã®é ç¹åŠç段éã«é¢é£ãããªãŒããŒããããåæžããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒããªããã£ãã®ãããã®åŠçãæé©åããããšã«ãããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãç¹ã«è€éãªãžãªã¡ããªãæã€ã·ãŒã³ã§ãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- å¹çïŒã¡ãã·ã¥ã·ã§ãŒããŒã¯ãç¹ã«ææ°ã®GPUã§ã¯ãåŸæ¥ã®é ç¹ããŒã¹ã®ã¬ã³ããªã³ã°ã·ã¹ãã ãããäžè¬çã«å¹ççã§ãã
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ã2ã€ã®æ°ããããã°ã©ã å¯èœãªã¹ããŒãžã䜿çšããŸãã
- ã¡ãã·ã¥çæã·ã§ãŒããŒïŒãã®ã·ã§ãŒããŒã¯é ç¹ã·ã§ãŒããŒã眮ãæããã¡ãã·ã¥ããŒã¿ãçæãŸãã¯æ¶è²»ã§ããŸããé ç¹ãšããªããã£ãã®ãããã§åäœããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒãã®ã·ã§ãŒããŒã¯åŸæ¥ã®ãã©ã°ã¡ã³ãã·ã§ãŒããŒãšåãã§ããããã¯ã»ã«ã¬ãã«ã®æäœã«äœ¿çšãããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã«ããæ©æãžãªã¡ããªé€å»
æ©æãžãªã¡ããªé€å»ãšã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã§å¯èœãªéãæ©ããçæ³çã«ã¯ãã©ã°ã¡ã³ãã·ã§ãŒããŒã«å°éããåã«ãããªããã£ããç Žæ£ããããã»ã¹ãæããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãæ©æãžãªã¡ããªé€å»æè¡ãå®è£ ããçµ¶å¥œã®æ©äŒãæäŸããŸããç¹ã«ã¡ãã·ã¥çæã·ã§ãŒããŒã¯ãããªããã£ããã¬ã³ããªã³ã°ããå¿ èŠããããã©ããã«ã€ããŠæ©æã«å€æããã®ã«çæ³çãªå Žæã«ãããŸãã
æ©æãžãªã¡ããªé€å»ã®ä»çµã¿ã次ã«ç€ºããŸãã
- å ¥åïŒã¡ãã·ã¥çæã·ã§ãŒããŒã¯ãéåžžãé ç¹ã®äœçœ®ããã®ä»ã®å±æ§ãå«ãå ¥åããŒã¿ãåä¿¡ããŸãã
- ã«ãªã³ã°ãã¹ãïŒã¡ãã·ã¥çæã·ã§ãŒããŒå ã§ã¯ãããŸããŸãªã«ãªã³ã°ãã¹ããå®è¡ãããŸãããããã®ãã¹ãã«ã¯ãèé¢ã«ãªã³ã°ãèŠéå°ã«ãªã³ã°ãããã³è·é¢ããŒã¹ã®ã«ãªã³ã°ïŒã«ã¡ã©ããé ãããããªããã£ãã®ã«ãªã³ã°ïŒãªã©ã®ããé«åºŠãªãã¯ããã¯ãå«ãŸããŸãã
- ããªããã£ãã®ç Žæ£ïŒãããã®ã«ãªã³ã°ãã¹ãã®çµæã«åºã¥ããŠãã·ã§ãŒããŒã¯è¡šç€ºãããªãããªããã£ããç Žæ£ã§ããŸããããã¯ãã¡ãã·ã¥ããªããã£ããåºåããªãããåŸã§ç Žæ£ãããç¹å®ã®ããªããã£ããåºåããããšã«ãã£ãŠè¡ãããŸãã
- åºåïŒã«ãªã³ã°ãã¹ãã«åæ Œããããªããã£ãã®ã¿ããã©ã¹ã¿ã©ã€ãºã®ããã«ãã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããŸãã
äž»ãªå©ç¹ã¯ãç Žæ£ãããããªããã£ãã«å¿ èŠãªèšç®ãã¹ããããããããšã§ããããã«ãããGPUã®èšç®è² è·ã軜æžãããããã©ãŒãã³ã¹ãåäžããŸãããã€ãã©ã€ã³ã§æ©æã«æåŠãçºçããã»ã©ãã¡ãªããã倧ãããªããŸãã
æ©æãžãªã¡ããªé€å»ã®å®è£ ïŒå®è·µçãªäŸ
ã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããŠæ©æãžãªã¡ããªé€å»ãå®è£ ããæ¹æ³ã®å ·äœçãªäŸãããã€ãèããŠã¿ãŸããããæ³šïŒå®éã®WebGLã¡ãã·ã¥ã·ã§ãŒããŒã³ãŒãã§ã¯ããã®èª¬æã®ç¯å²ãè¶ ããWebGLæ¡åŒµæ©èœã®ã»ããã¢ãããšãã§ãã¯ãå¿ èŠã§ãããæŠå¿µã¯åãã§ããWebGL 2.0 +ã¡ãã·ã¥ã·ã§ãŒããŒæ¡åŒµæ©èœãæå¹ã«ãªã£ãŠãããšä»®å®ããŸãã
1. è·é¢ããŒã¹ã®ã«ãªã³ã°
ãã®ææ³ã§ã¯ãããªããã£ããã«ã¡ã©ããé ãããå Žåãããªããã£ãã¯ã«ãªã³ã°ãããŸããããã¯ãç¹ã«å€§èŠæš¡ãªãªãŒãã³ã¯ãŒã«ãç°å¢ã§ã¯ãã·ã³ãã«ã§ãã广çãªæé©åã§ããåºæ¬çãªèãæ¹ã¯ãåããªããã£ããšã«ã¡ã©ã®éã®è·é¢ãèšç®ããäºåã«å®çŸ©ãããè·é¢ã®ãããå€ãè¶ ããããªããã£ããç Žæ£ããããšã§ãã
äŸïŒæŠå¿µçãªç䌌ã³ãŒãïŒïŒ
mesh int main() {
// Assume 'vertexPosition' is the position of a vertex.
// Assume 'cameraPosition' is the camera's position.
// Assume 'maxDistance' is the maximum rendering distance.
float distance = length(vertexPosition - cameraPosition);
if (distance > maxDistance) {
// Discard the primitive (or don't generate it).
return;
}
// If within range, emit the primitive and continue processing.
EmitVertex(vertexPosition);
}
ãã®ç䌌ã³ãŒãã¯ãã¡ãã·ã¥ã·ã§ãŒããŒå ã§è·é¢ããŒã¹ã®ã«ãªã³ã°ãã©ã®ããã«å®è¡ããããã瀺ããŠããŸããã·ã§ãŒããŒã¯ãé ç¹ã®äœçœ®ãšã«ã¡ã©ã®äœçœ®ã®éã®è·é¢ãèšç®ããŸããè·é¢ãäºåã«å®çŸ©ããããããå€ïŒ`maxDistance`ïŒãè¶ ãããšãããªããã£ããç Žæ£ããã貎éãªGPUãªãœãŒã¹ãç¯çŽãããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯éåžžãè€æ°ã®ããªããã£ããäžåºŠã«åŠçãããã®èšç®ã¯ãããå ã®åããªããã£ãã«å¯ŸããŠè¡ãããããšã«æ³šæããŠãã ããã
2. ã¡ãã·ã¥ã·ã§ãŒããŒã§ã®èŠéå°ã«ãªã³ã°
ã¡ãã·ã¥ã·ã§ãŒããŒå ã§èŠéå°ã«ãªã³ã°ãå®è£ ãããšãåŠçããå¿ èŠã®ããããªããã£ãã®æ°ãå€§å¹ ã«æžããããšãã§ããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯é ç¹ã®äœçœ®ã«ã¢ã¯ã»ã¹ã§ããããïŒãããã£ãŠãããªããã£ãã®å¢çããªã¥ãŒã ãŸãã¯AABB - 軞平è¡å¢çããã¯ã¹ã決å®ã§ããŸãïŒãæ¡åŒµæ©èœãšããŠãããªããã£ããèŠéå°å ã«ãããã©ãããèšç®ã§ããŸããããã»ã¹ã«ã¯ä»¥äžãå«ãŸããŸãã
- èŠéå°å¹³é¢ã®èšç®ïŒã«ã¡ã©ã®èŠéå°ãå®çŸ©ãã6ã€ã®å¹³é¢ã決å®ããŸããããã¯éåžžãã«ã¡ã©ã®æåœ±è¡åãšãã¥ãŒè¡åã䜿çšããŠè¡ãããŸãã
- èŠéå°å¹³é¢ã«å¯Ÿããããªããã£ãã®ãã¹ãïŒåããªããã£ãã«ã€ããŠããã®å¢çããªã¥ãŒã ïŒããšãã°ãå¢ççãŸãã¯AABBïŒãåèŠéå°å¹³é¢ã«å¯ŸããŠãã¹ãããŸããå¢çããªã¥ãŒã ãå¹³é¢ã®ããããã®å€åŽã«å®å šã«ããå Žåãããªããã£ãã¯èŠéå°ã®å€åŽã«ãããŸãã
- å€åŽã®ããªããã£ãã®ç Žæ£ïŒèŠéå°ã®å®å šã«å€åŽã«ããããªããã£ããç Žæ£ããŸãã
äŸïŒæŠå¿µçãªç䌌ã³ãŒãïŒïŒ
mesh int main() {
// Assume vertexPosition is the vertex position.
// Assume viewProjectionMatrix is the view-projection matrix.
// Assume boundingSphere is a bounding sphere centered at the primitive's center and a radius
// Transform the bounding sphere's center to clip space
vec4 sphereCenterClip = viewProjectionMatrix * vec4(boundingSphere.center, 1.0);
float sphereRadius = boundingSphere.radius;
// Test against the six frustum planes (simplified)
if (sphereCenterClip.x + sphereRadius < -sphereCenterClip.w) { return; } // Left
if (sphereCenterClip.x - sphereRadius > sphereCenterClip.w) { return; } // Right
if (sphereCenterClip.y + sphereRadius < -sphereCenterClip.w) { return; } // Bottom
if (sphereCenterClip.y - sphereRadius > sphereCenterClip.w) { return; } // Top
if (sphereCenterClip.z + sphereRadius < -sphereCenterClip.w) { return; } // Near
if (sphereCenterClip.z - sphereRadius > sphereCenterClip.w) { return; } // Far
// If not culled, generate and emit mesh primitive.
EmitVertex(vertexPosition);
}
ãã®ç䌌ã³ãŒãã¯ãäžå¿ãšãªãèãæ¹ãæŠèª¬ããŠããŸããå®éã®å®è£ ã§ã¯ãå¢çããªã¥ãŒã ã倿ããããã®è¡åä¹ç®ãå®è¡ããæ¬¡ã«èŠéå°å¹³é¢ãšæ¯èŒããå¿ èŠããããŸããå¢çããªã¥ãŒã ãããæ£ç¢ºã§ããã»ã©ããã®ã«ãªã³ã°ã¯ããå¹ççã«ãªããŸããããã«ãããã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã«éä¿¡ãããäžè§åœ¢ã®æ°ãå€§å¹ ã«åæžãããŸãã
3. èé¢ã«ãªã³ã°ïŒé ç¹ã®é åºã®æ±ºå®ä»ãïŒ
èé¢ã«ãªã³ã°ã¯éåžžãåºå®æ©èœãã€ãã©ã€ã³ã§åŠçãããŸãããã¡ãã·ã¥ã·ã§ãŒããŒã¯é ç¹ã®é åºãåæããããšã«ãããèé¢ã決å®ããæ°ããæ¹æ³ãæäŸããŸããããã¯ãé倿§äœãžãªã¡ããªã§ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒæŠå¿µçãªç䌌ã³ãŒãïŒïŒ
mesh int main() {
// Assume vertex positions are available
vec3 v1 = vertexPositions[0];
vec3 v2 = vertexPositions[1];
vec3 v3 = vertexPositions[2];
// Calculate the face normal (assuming counter-clockwise winding)
vec3 edge1 = v2 - v1;
vec3 edge2 = v3 - v1;
vec3 normal = normalize(cross(edge1, edge2));
// Calculate the dot product of the normal and the camera direction
// Assume cameraPosition is the camera's position.
vec3 cameraDirection = normalize(v1 - cameraPosition);
float dotProduct = dot(normal, cameraDirection);
// Cull the face if it's facing away from the camera
if (dotProduct > 0.0) {
return;
}
EmitVertex(vertexPositions[0]);
EmitVertex(vertexPositions[1]);
EmitVertex(vertexPositions[2]);
}
ããã¯ãé¢ã®æ³ç·ãèšç®ããæ¹æ³ãšããããç©ã䜿çšããŠé¢ãã«ã¡ã©ã«é¢ããŠãããã©ããã確èªããæ¹æ³ã瀺ããŠããŸãããããç©ãæ£ã®å Žåãé¢ã¯é¢ããæ¹åãåããŠãããã«ãªã³ã°ããå¿ èŠããããŸãã
ãã¹ããã©ã¯ãã£ã¹ãšèæ ®äºé
æ©æãžãªã¡ããªé€å»ã广çã«å®è£ ããã«ã¯ãæ éãªæ€èšãå¿ èŠã§ãã
- æ£ç¢ºãªå¢çããªã¥ãŒã ïŒã«ãªã³ã°ãã¹ãã®ç²ŸåºŠã¯ãå¢çããªã¥ãŒã ã®å質ã«å€§ããäŸåããŸããããã¿ã€ããªå¢çããªã¥ãŒã ã¯ãããå¹ççãªã«ãªã³ã°ã«ã€ãªãããŸãããžãªã¡ããªã«å¿ããŠãå¢ççã軞平è¡å¢çããã¯ã¹ïŒAABBïŒããŸãã¯æåæ§å¢çããã¯ã¹ïŒOBBïŒã®äœ¿çšãæ€èšããŠãã ããã
- ã¡ãã·ã¥ã·ã§ãŒããŒã®è€éãïŒåŒ·åã§ãããã¡ãã·ã¥ã·ã§ãŒããŒã¯è€éããå¢ããŸããé床ã«è€éãªã¡ãã·ã¥ã·ã§ãŒããŒã¯ãããã©ãŒãã³ã¹ã®åäžãæã¡æ¶ãå¯èœæ§ããããŸããæç¢ºã§ç°¡æœãªã³ãŒããç®æããŠãã ããã
- ãªãŒããŒãããŒã®èæ ®äºé ïŒã«ãªã³ã°ææ³ããæ¬æ¥ã¯è¡šç€ºãããããªããã£ããåé€ããŠããªãããšã確èªããŠãã ãããäžæ£ç¢ºãŸãã¯é床ã«ã¢ã°ã¬ãã·ããªã«ãªã³ã°ã¯ãèŠèŠçãªã¢ãŒãã£ãã¡ã¯ãã«ã€ãªããå¯èœæ§ããããŸãã
- ãããã¡ã€ãªã³ã°ïŒãããã®ææ³ãå®è£ ããåŸãã¢ããªã±ãŒã·ã§ã³ãå³å¯ã«ãããã¡ã€ã«ããŠãæå³ããããã©ãŒãã³ã¹ã®åäžãéæãããŠããããšã確èªããŸãããã©ãŠã¶ã®éçºè ããŒã«ãŸãã¯GPUãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã¬ãŒã ã¬ãŒããæž¬å®ããæœåšçãªããã«ããã¯ãç¹å®ããŸããChrome DevToolsãFirefox Developer Toolsãªã©ã®ããŒã«ã¯ãçµã¿èŸŒã¿ã®WebGLãããã¡ã€ãªã³ã°æ©èœãæäŸããRenderDocãªã©ã®ããé«åºŠãªããŒã«ã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«é¢ããè©³çŽ°ãªæŽå¯ãæäŸã§ããŸãã
- ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ïŒããã©ãŒãã³ã¹ãšèŠèŠåè³ªã®æé©ãªãã©ã³ã¹ãå®çŸããããã«ãã«ãªã³ã°ãã©ã¡ãŒã¿ãŒïŒããšãã°ãè·é¢ããŒã¹ã®ã«ãªã³ã°ã®`maxDistance`ïŒã埮調æŽããŸãã
- äºææ§ïŒåžžã«ã¡ãã·ã¥ã·ã§ãŒããŒãšã®ãã©ãŠã¶/ããã€ã¹ã®äºææ§ã確èªããŠãã ãããå¿ èŠãªæ¡åŒµæ©èœããµããŒãããããã«WebGLã³ã³ããã¹ããæ§æãããŠããããšã確èªããŠãã ãããå®å šãªæ©èœã»ããããµããŒãããŠããªãããã€ã¹ã«ã¯ããã©ãŒã«ããã¯æŠç¥ãæäŸããŠãã ããã
ããŒã«ãšã©ã€ãã©ãª
äžå¿ãšãªãæŠå¿µã¯ã·ã§ãŒããŒã³ãŒãã§åŠçãããŸãããç¹å®ã®ã©ã€ãã©ãªãšããŒã«ã¯ã¡ãã·ã¥ã·ã§ãŒããŒã®éçºãç°¡çŽ åããã®ã«åœ¹ç«ã¡ãŸãã
- GLSLifyããã³WebGLæ¡åŒµïŒGLSLifyã¯ãWebGLäºæã®GLSLã·ã§ãŒããŒãJavaScriptãã¡ã€ã«å ã«ãã³ãã«ããããã®browserify倿ã§ãããã·ã§ãŒããŒã®ç®¡çãåçåããŸããWebGLæ¡åŒµæ©èœã«ãããã¡ãã·ã¥ã·ã§ãŒããŒããã®ä»ã®é«åºŠãªæ©èœã䜿çšã§ããŸãã
- ã·ã§ãŒããŒãšãã£ã¿ãŒãšãããã¬ãŒïŒã·ã§ãŒããŒãšãã£ã¿ãŒïŒShaderToyã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãªã©ïŒã䜿çšããŠãã·ã§ãŒããŒãããç°¡åã«èšè¿°ããã³ãããã°ããŸãã
- ãããã¡ã€ãªã³ã°ããŒã«ïŒäžèšã§èª¬æãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããŸããŸãªã«ãªã³ã°æ¹æ³ã®ããã©ãŒãã³ã¹ããã¹ãããŸãã
ã°ããŒãã«ãªåœ±é¿ãšå°æ¥ã®ãã¬ã³ã
ã¡ãã·ã¥ã·ã§ãŒããŒã𿩿ãžãªã¡ããªé€å»ã®åœ±é¿ã¯äžçäžã«åºãããäžçäžã®ãŠãŒã¶ãŒã«åœ±é¿ãäžããŠããŸããæ¬¡ã®ãããªã¢ããªã±ãŒã·ã§ã³ïŒ
- ã€ã³ã¿ã©ã¯ãã£ããªãŠã§ãããŒã¹ã®3Dã¢ãã«ïŒã€ã³ã¿ã©ã¯ãã£ããª3D補åãã¥ãŒã¢ãŒã¯ãeã³ããŒã¹ïŒå®¶å ·ãè»ããŸãã¯è¡£æåã衚瀺ãããªã³ã©ã€ã³ã¹ãã¢ãšèããŠãã ããïŒã«å€§ããªã¡ãªããããããããŸãã
- ãŠã§ãã²ãŒã ïŒ3Dã°ã©ãã£ãã¯ã¹ã䜿çšãããã¹ãŠã®ãŠã§ãããŒã¹ã®ã²ãŒã ã¯ããããã®æé©åã®æ©æµãåããŸãã
- ç§åŠçèŠèŠåïŒå€§èŠæš¡ãªããŒã¿ã»ããïŒå°è³ªããŒã¿ãå»çã¹ãã£ã³ïŒãè¿ éã«ã¬ã³ããªã³ã°ããæ©èœã¯ãå€§å¹ ã«åŒ·åã§ããŸãã
- ä»®æ³çŸå®ïŒVRïŒããã³æ¡åŒµçŸå®ïŒARïŒã¢ããªã±ãŒã·ã§ã³ïŒãã¬ãŒã ã¬ãŒãã¯VR/ARã«ãšã£ãŠéåžžã«éèŠã§ãã
ãããã®æé©åã«ãããããè€éã§è©³çްãªã·ãŒã³ãå¯èœã«ãªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸããå°æ¥ã®ãã¬ã³ãã圢ã«ãªãã€ã€ãããŸãã
- ããŒããŠã§ã¢ãµããŒãã®åäžïŒGPUãé²åããã«ã€ããŠãã¡ãã·ã¥ã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ã¯åäžãç¶ããŸãã
- ããé«åºŠãªã«ãªã³ã°æè¡ïŒæ©æ¢°åŠç¿ããã®ä»ã®é«åºŠãªæè¡ã掻çšããŠããŸããŸãé«åºŠãªã«ãªã³ã°ã¢ã«ãŽãªãºã ã®éçºãæåŸ ãããŸãã
- ããå¹ åºãæ¡çšïŒã¡ãã·ã¥ã·ã§ãŒããŒã¯ããŠã§ãã°ã©ãã£ãã¯ã¹ããŒã«ãããã®æšæºçãªéšåã«ãªãå¯èœæ§ãé«ãããŠã§ãå šäœã®ããã©ãŒãã³ã¹ã®åäžãä¿é²ããŸãã
çµè«
ããªããã£ãã«ãªã³ã°ãç¹ã«ã¡ãã·ã¥ã·ã§ãŒããŒã«ãã£ãŠä¿é²ãããæ©æãžãªã¡ããªé€å»ã¯ãWebGLããŒã¹ã®3Dã°ã©ãã£ãã¯ã¹ãæé©åããããã®éèŠãªãã¯ããã¯ã§ããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®æ©ã段éã§äžèŠãªãžãªã¡ããªãç Žæ£ããããšã«ãããéçºè ã¯ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããããã¹ã ãŒãºãªããžã¥ã¢ã«ãšãã°ããŒãã«ãªèŠèŽè ã«ãšã£ãŠããæ¥œãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸãããããã®ææ³ãå®è£ ããã«ã¯ãæ éãªæ€èšãšã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®æ·±ãçè§£ãå¿ èŠã§ãããããã©ãŒãã³ã¹ã®ã¡ãªããã¯åªåãã䟡å€ããããŸãããŠã§ããã¯ãããžãŒã鲿©ãç¶ããã«ã€ããŠãæ©æãžãªã¡ããªé€å»ã®ãããªææ³ãæ¡çšããããšããäžçäžã®ã©ãã§ãããŠã§ãäžã§é åçã§æ²¡å ¥åã®3Dãšã¯ã¹ããªãšã³ã¹ãæäŸããéµãšãªããŸãã